<?php
/**
 * imagick图片处理类
 *
 */
class imagick_class {
    var $img;   //图像标识符 
    var $info;  //保存图片的一些信息
	var $filename;	//要处理的图片名称
	
	public function __construct() {				
	}
	
	public function init($name) {
		$this->img = new imagick($name);
	}
	/** 
	* 生成缩略图 
	* 
	* @param int $width 宽度 
	* @param int $height 高度 
	* @param boolean $crop 是否对超出部分进行裁剪,默认为是, 如果不裁剪,则缩图将等比缩放至小于目标尺寸 
	* @param boolean $center crop时是否在中间裁剪 
	* @param string $path 要生成的新文件名 
	*/ 
	public function thumbnail($width=null, $height=null, $crop=true, $center=true, $path=null, $quality=null) {
		if($crop) {
			$this->cropThumb($width, $height, $quality);
		}else{
			$this->resize($width, $height, $quality);
		}
		
		$this->loadFile(); 
		if($path) return $this->save($path); 
		$this->img->destroy(); 
		$this->img->clear();
		return $this; 
	}
	
	 /** 
	  * 图片缩放 
	  * 
	  * @param int $width 目标宽度 
	  * @param int $height 目标高度 
	  * @param boolean $keepScale，是否等比缩放 
	  * @return array $wh 包含缩放后宽度和高度的数组 $wh[0]为宽度，$wh[1]为高度 
	  */ 
	 public function resize($width, $height, $qui = 75) {	
		 $this->loadFile();
		 $srcw = $this->info['width'];
		 $srch = $this->info['height'];
		 if(!$width) {
			 $width = $srcw; 
		 }

		 if(!$height) {
			 $height = $srch;
		 }
		 
		 if($srcw < $width && $srch < $height) {
			 $width = $srcw;
			 $height = $srch;
		 }		 
		 
		if($height == 0 || (double)($srcw/$srch) > (double)($width/$height)) //原始宽高比大于目标宽高比,调整高度 
		{ 
			$height = 0;
		}else{ ///原始宽高比小于目标宽高比,调整宽度 			 
			$width = 0;
		}
		
		$this->img->setImageCompression(Imagick::COMPRESSION_JPEG);  
		$this->img->setCompressionQuality($qui);
		$this->img->thumbnailImage($width, $height);
	 }
	 
	 /** 
	  * 图片压缩裁剪 
	  * 
	  * @param int $w 裁剪宽度 
	  * @param int $h 裁剪高度 
	  * @return resource 返回裁剪后的图片资源 
	  */ 
	 public function cropThumb($width, $height, $qui = 75){ 
		if(!$width) {
			$width = $srcw; 
		}

		if(!$height) {
			$height = $srch;
		}
		
		$this->img->setImageCompression(Imagick::COMPRESSION_JPEG); 
		$this->img->setCompressionQuality($qui);
		$this->img->cropThumbnailImage($width, $height);		
	 }
	 
	 /** 
	  * 图片裁剪 
	  * 
	  * @param int $w 裁剪宽度 
	  * @param int $h 裁剪高度
	  * @param int $x x坐标
	  * @param int $y y坐标  
	  * @return resource 返回裁剪后的图片资源 
	  */ 
	 public function crop($x, $y, $w, $h, $path=null, $quality=null){ 		
		$this->img->setImageCompression(Imagick::COMPRESSION_JPEG); 
		$this->img->setCompressionQuality($qui);
		$this->img->cropImage($w, $h, $x, $y);
		if($path) return $this->save($path);
	 }	 
	 
	 /*
	  * 获取图片属性
	  */
	 public function loadFile() {
		 $this->info = $this->img->getImageGeometry();
		 return $this;
	 }
	 
	  /** 
	  * 保存到文件 
	  *  
	  * @param string $path 文件的绝对路径  
	  */ 
	 function save($path) { 
		 return $this->_output($path); 
	 }
	 
	 /** 
	  * 将图片输出到浏览器 
	  * 
	  * @param $type 格式 
	  */ 
	 function output($type='jpg') {                
		 return $this->_output('stream', $type); 
	 }
	 
	 //输出函数，内部使用 
	 function _output($path, $type=null) {                
		 $toFile = false; 
		 //输出到文件 
		 if($path !='stream') { 
				 if(!is_dir(dirname($path))) 
						 $this->exceptionFunc('指定的路径不可用 =>'.$path); 
				 $type = pathinfo($path, PATHINFO_EXTENSION); 
				 $toFile = true; 
		 } 

		 if($type == "jpg") $type = "jpeg"; 

		 if($toFile) {
			 $this->img->writeImage($path);
		 }else{ 
			 if(!headers_sent()) 
				 header("Content-type:image/".$type); 
			 echo $this->img;
			 exit;
		 } 
		 
		 return $this;
	 }	 
}
